import { ElMessage, ElMessageBox, ElNotification } from "element-plus";
import api from '../api/api';
export default class SocketService {
  static instance = null;
  static get Instance() {
    if (!this.instance) {
      this.instance = new SocketService();
    }
    return this.instance;
  }
  // 和服务端连接的socket对象
  ws = null;

  url = api.getWsUrl();
  // 存储回调函数
  callBackMapping = {};
  // 标识是否连接成功
  connected = false;
  // 记录重试的次数
  sendRetryCount = 0;
  // 重新连接尝试的次数
  connectRetryCount = 0;
  //  定义连接服务器的方法
  connect() {
    // console.log(api.getWsUrl())
    // 连接服务器
    if (!window.WebSocket) {
      return console.log("您的浏览器不支持WebSocket");
    }
    // let token = $.cookie('123');
    // let token = '4E6EF539AAF119D82AC4C2BC84FBA21F';
    this.ws = new WebSocket(this.url);
    // 连接成功的事件
    this.ws.onopen = () => {
      console.log("连接服务端成功了");
      this.connected = true;
      // 重置重新连接的次数
      this.connectRetryCount = 0;
    };
    // 1.连接服务端失败
    // 2.当连接成功之后, 服务器关闭的情况
    this.ws.onclose = (res) => {
      console.log(res);
      console.log("连接服务端失败");
      this.connected = false;
      // this.connectRetryCount = 0;
    };
    // 得到服务端发送过来的数据
    this.ws.onmessage = (msg) => {
      let obj;
      if (msg.data) {
        try {
          obj = JSON.parse(msg.data);
        } catch (e) { }
        if (obj.optionCode == "notify") {
          // console.log(obj)
          // ElMessage.success(obj.message);
          //清空之前所有 ElNotification.closeAll();
          ElNotification({
            title: '通知',
            message: obj.message,
            duration: 0,
          })
          const music = new Audio('alarm.wav');
          if (music && obj.message.indexOf("位于") != -1) {
            console.log(1111)
            music.play();
            music.loop = false;//是否循环播放
            music.playbackRate = 1;
            // music.ended = true;
            setTimeout(function () {
              music.pause();
            }, 4000)
          }
        }
      }
      // console.log(msg.data);
    };
  }
  againConnect() {
    this.connectRetryCount++;
    setTimeout(() => {
      this.connect();
    }, 500 * this.connectRetryCount);
  }
  // 回调函数的注册
  registerCallBack(socketType, callBack) {
    this.callBackMapping[socketType] = callBack;
  }
  // 取消某一个回调函数
  unRegisterCallBack(socketType) {
    this.callBackMapping[socketType] = null;
  }
  // 发送数据的方法
  send(data) {
    // 判断此时此刻有没有连接成功
    if (this.connected) {
      this.sendRetryCount = 0;
      try {
        this.ws.send(JSON.stringify(data));
      } catch (e) {
        this.ws.send(data);
      }
    } else {
      this.sendRetryCount++;
      setTimeout(() => {
        this.send(data);
      }, this.sendRetryCount * 500);
    }
  }
}
